S00-00 General-Server
[TOC]
实战场景
个人信息
服务器:阿里云
配置信息:
- IP 地址:120.xx.xx.xx
- 实例配置:CPU_2 核 内存_2GB
- 系统盘:40GB
- 带宽:3M
- 到期时间:2026-04-01 23:59:59(【TODO:待续费】)
- 续费价格:99 元 / 年
域名
mrer.top
注册/到期时间:2024-03-25 到 2034-03-25
托管平台:阿里云
ICP 备案:已备案
价格:90元 /10年
域名解析:
子域名 记录类型 目标 说明 * A 120.xx.xx.xx 阿里云 img TXT leafer.qzz.io CF Saas 自定义主机名 note TXT leafer.qzz.io CF Saas 自定义主机名 storage TXT leafer.qzz.io CF Saas 自定义主机名 img CNAME cloudflare.182682.xyz 域名加速 note CNAME cloudflare.182682.xyz 域名加速 storage CNAME cloudflare.182682.xyz 域名加速 cdn CNAME qiniudns.com 七牛云图床
其他域名
| 域名 | 注册平台 | 托管平台 | 价格 | 注册/到期时间 | 备注 |
|---|---|---|---|---|---|
| leafer.qzz.io | DigitalPlat(1/2) | Cloudflare | 免费 | 2025-12-01 到 2026-12-01 | 保活半年 |
| mrer.qzz.io | DigitalPlat(2/2) | Cloudflare | 免费 | 2026-01-15 到 2027-01-15 | 保活半年 |
| mrer.de5.net | DNSHE(1/10) | Cloudflare | 免费 | 2025-12-04 到 永久 | |
| rayer.de5.net | DNSHE(2/10) | Cloudflare | 免费 | 2025-12-04 到 永久 | |
| hachimitu.de5.net | DNSHE(3/10) | Cloudflare | 免费 | 2025-12-04 到 永久 | |
| rayer.ggff.net | L53(1/1) | Cloudflare | 免费 | 2025-12-04 到 2027-12-04 | 2年期限 |
| mivo.eu.cc | GNAME(1/3) | Cloudflare | 免费 | 2026-01-27 到 2027-01-27 | 每年到期前90天续费 |
| realme.eu.cc | GNAME(2/3) | Cloudflare | 免费 | 2026-01-27 到 2027-01-27 | 免费续费地址 |
| leafer.eu.cc | GNAME(3/3) | Cloudflare | 免费 | 2026-01-27 到 2027-01-27 |
实战:申请 SSL 证书
方案1:acme.sh + 阿里云
针对阿里云上购买的服务器和域名,使用 acme.sh 配合阿里云的 DNS API 模式 是最理想的选择。这种方式不需要你手动去域名后台加解析记录,脚本会自动完成“添加记录 -> 验证 -> 删除记录”的全过程。
以下是详细的操作步骤和命令解析:
第一步:获取阿里云 AccessKey:
要让脚本自动修改 DNS,你需要给它“钥匙”。
- 登录阿里云后台,点击右上角头像 -> AccessKey 管理。
- 创建一个 AccessKey(建议使用 RAM 子账号并只授予
AliyunDNSFullAccess权限以保安全)。 - 获取 AccessKey ID 和 AccessKey Secret。
第二步:配置环境变量:
在你的服务器终端输入以下命令(替换为你实际的 Key):
export Ali_Key="LTAI5t7xxxxxxxxxxxxxxx"
export Ali_Secret="sdfsdfxxxxxxxxxxxxxxx"export:将变量设置为当前会话的环境变量。- 含义:
acme.sh内部集成了阿里云的插件,它会自动读取这两个命名的变量来调用阿里云 API。
第三步:一键申请证书:
执行以下申请命令:
acme.sh --issue --dns dns_ali -d example.com -d *.example.com--issue:告诉脚本开始申请。--dns dns_ali:核心参数。指定使用阿里云的 DNS 接口进行验证。-d example.com:你的主域名。-d *.example.com:通配符域名。申请成功后,你所有的子域名(如blog.example.com,api.example.com)都可以共用这一张证书。
判断证书申请是否成功:
如果申请成功了,日志最后会显示绿色的 "Cert success",并且你会看到如下文件路径提示:
Your cert is in: /root/.acme.sh/mrer.top_ecc/mrer.top.cerYour cert key is in: /root/.acme.sh/mrer.top_ecc/mrer.top.keyThe intermediate CA cert is in: ...And the full chain certs is in: /root/.acme.sh/mrer.top_ecc/fullchain.cer
问题:证书颁发机构 ZeroSSL 拥堵
由于 acme.sh 默认的证书颁发机构是 ZeroSSL,它的服务器经常拥堵或出故障,会让你的脚本等待 86400 秒(24小时)后再试,而脚本保护性地拒绝了这种无理要求并终止了任务。
解决方案:切换到 Let's Encrypt
由于 ZeroSSL 最近经常出现这种不稳定的情况,建议你直接切换到更稳定的 Let's Encrypt。这是目前最通用的解决方法。
请依次执行以下两条命令:
第一步:切换默认 CA 为 Let's Encrypt
bashacme.sh --set-default-ca --server letsencrypt第二步:重新申请证书
bashacme.sh --issue --dns dns_ali -d example.top -d *.example.top
第四步:安装证书到指定位置:
申请成功后,证书存放在 ~/.acme.sh/ 的隐藏目录下。不要直接引用那里的文件,因为路径可能会变。你需要用 install-cert 命令将其“发布”到你的 Web 服务器目录。
以 Nginx 为例:
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "systemctl reload nginx"--key-file:将私钥复制到指定位置。--fullchain-file:将完整的证书链复制到指定位置(Nginx 必须使用 fullchain)。--reloadcmd:这是最强大的一点。证书每 60 天会自动续期,续期成功后,acme.sh会自动运行这个命令(重启 Nginx),实现证书更新无感化。
进阶:如何检查自动续期任务:
acme.sh 在安装时会自动往你的 Linux 系统里添加一个 crontab 计划任务。你可以输入以下命令查看:
crontab -l你会看到类似这样的一行: 56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
- 含义:系统每小时会检查一次证书。如果证书距离到期不足 30 天,它就会自动重复上述的 API 验证过程,并更新你的证书文件。
方案2:acme.sh + Cloudflare
由于域名托管在 Cloudflare 且没有 ICP 备案,而在阿里云国内节点运行,最稳妥且能自动续期的方案是使用 Cloudflare DNS API 验证模式。
这样可以避开阿里云对 80 端口的备案拦截,同时利用 Cloudflare 的 API 自动完成证书申请。
第一步:获取 Cloudflare API 令牌:
为了让脚本自动修改 DNS 记录进行验证,你需要获取 API Key:
- 登录 Cloudflare 控制台。
- 点击右上角 个人资料 -> API 令牌。
- 找到 Global API Key,点击“查看”并保存(或者创建一个仅具有 DNS 修改权限的专用令牌)。
第二步:在服务器设置环境变量:
在您的 CentOS Stream 9 终端输入:
export CF_Key="你的Global_API_Key"
export CF_Email="你的Cloudflare注册邮箱"第三步:一键申请通配符证书:
执行以下命令。注意:即便服务器在国内,由于是 DNS 验证,流量是发往 Cloudflare 的 API 接口,因此不会受到备案限制的影响。
acme.sh --issue --dns dns_cf -d mrer.top -d *.mrer.top--dns dns_cf:强制使用 Cloudflare 的 DNS 接口验证。-d *.mrer.top:强烈建议申请通配符证书,这样你以后新增任何子域名(如note.mrer.top)都无需重新备案或申请。
第四步:部署到 Nginx(避开 80 端口):
因为没有备案,你的 80 端口无法正常提供 Web 验证服务。我们将证书安装到指定目录,并准备通过 Cloudflare Tunnel 或 非标端口 访问。
# 创建存储目录
mkdir -p /etc/nginx/ssl/
# 安装证书
acme.sh --install-cert -d mrer.top --ecc \
--key-file /etc/nginx/ssl/mrer.top.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "systemctl reload nginx"第五步:Nginx 配置与绕过备案建议:
在您的 Nginx 配置文件中,引用这些证书:
server {
listen 443 ssl;
server_name mrer.top;
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/mrer.top.key;
# ... 其他配置 ...
}关键:如何访问:
由于没有备案,即便你配置了 443 端口,阿里云的网关依然可能拦截 HTTPS 请求。
- 方案 A(最推荐):使用 Cloudflare Tunnel。在服务器运行
cloudflared隧道。流量从 CF 内部直接穿透到服务器,完全绕过备案检测。 - 方案 B:将域名在 Cloudflare 后台开启“小云朵”(Proxy),并尝试在 CF 设置中开启 ?Authenticated Origin Pulls?,这能一定程度上增加穿透成功率,但国内节点仍有被拦截风险。
创建 RAM 用户并授权
为阿里云创建 RAM(Resource Access Management) 子账号并授予最小化权限,是保护主账号安全、实现自动化工具(如 acme.sh)安全调用的最佳实践。
以下是详细的操作步骤:
第一阶段:创建 RAM 用户:
登录 阿里云控制台。
在顶部搜索栏输入 RAM,点击进入 访问控制 控制台。
在左侧导航栏,点击 身份管理 -> 用户。
点击 创建用户。
配置参数:
登录名称:例如
acme-sh-operator。显示名称:例如
SSL证书自动化工具。访问方式:勾选“使用永久 AccessKey 访问”(这会生成
AccessKey ID和AccessKey Secret)。注意:不需要勾选“控制台登录”。
点击 确定。
第二阶段:保存 API 密钥(关键):
创建成功后,页面会显示该用户的 AccessKey ID 和 AccessKey Secret。
立即保存:点击“下载 CSV 文件”或手动复制。
警告:Secret 只在此刻显示一次,刷新页面后将无法再次查看。如果丢失,只能删除旧的 Key 并重新生成。
第三阶段:精准授权 (AliyunDNSFullAccess):
创建完用户后,它默认是没有任何权限的。我们需要专门给它管理 DNS 的权力。
在用户列表页面,找到你刚刚创建的用户,点击其右侧操作列的 添加权限。
配置资源范围:
- 授权范围:选择“账号级别”。
选择策略:
在搜索框输入
DNS。在系统策略列表中找到并点击 AliyunDNSFullAccess(管理云解析服务的权限)。
点击 确定,完成授权。
第四阶段:在服务器上验证权限:
现在你可以回到 CentOS 服务器,将这对“子账号”的密钥填入 acme.sh 的配置中。
# 替换为你刚才保存的子账号 Key
export Ali_Key="LTAI5txxxxxxxxxxxxxx"
export Ali_Secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# 尝试申请证书(测试权限是否生效)
acme.sh --issue --dns dns_ali -d yourdomain.com为什么这样做更安全:
| 账号类型 | 风险场景 | 影响后果 |
|---|---|---|
| 主账号 API Key | 服务器被黑,Key 泄露。 | 攻击者可以重置你的服务器、查看账单甚至删库。 |
| RAM 子账号 Key | 服务器被黑,Key 泄露。 | 攻击者只能修改你的域名解析记录,无法触碰你的服务器、数据库或资金。 |
常见问题排查:
- 报错 AccessDenied:请检查授权是否已经点击“确定”并生效。有时会有 1 分钟左右的缓存延迟。
- 权限过大?:如果你觉得
FullAccess还是太大,阿里云支持自定义策略,可以精确到“只能修改某一个域名的记录”,但对于acme.sh来说,通常AliyunDNSFullAccess是最平衡的选择。
后续:配置 Nginx
完成了 SSL 证书的申请后,此时申请下来的证书,已经存在于 /etc/nginx/ssl/目录下了。现在我们要做的就是将其和 nginx 联系起来。可以在 Nginx 中进行如下配置:
注意:每个 Server 都要引入 SSL 证书:
虽然你申请的是 通配符证书 (*.mrer.top),它已经包含了所有二级子域名。但 Nginx 的每个 server 块都是独立的,它需要明确知道该去哪里读取这个证书。
Nginx 的逻辑是:“按需加载”。 当你添加 note.mrer.top 时,Nginx 需要确认这个虚拟主机是否支持 SSL,以及使用哪张证书。由于 acme.sh 已经把证书安装到了 /etc/nginx/ssl/ 这个固定位置,你只需要“指路”即可。
实操建议:如何更优雅地配置:
如果你有很多子域名(比如 note, blog, api),在每个 server 块里都复制一遍这 10 几行 SSL 配置会显得很乱。
最佳实践:使用 include 抽离配置。
第一步:创建一个通用的 SSL 配置文件:
创建一个新文件 /etc/nginx/conf.d/common-ssl.inc:
注意:此处创建的文件后缀是 .inc,如果是 .conf,会在 Server 配置外部被引入,而 SSL 引入只能发生在 Server 内部。
# /etc/nginx/conf.d/common-ssl.inc
# 主要配置(必选)
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# 这里放你刚才那些安全配置(可选)
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;第二步:在不同的子域名 Server 块中快速引用:
这样你的配置就会变得非常整洁:
# 你的主站配置
server {
listen 443 ssl;
server_name example.com;
include /etc/nginx/conf.d/common-ssl.conf; # 一行引入
location / { ... }
}
# 你的笔记站点配置
server {
listen 443 ssl;
server_name note.example.com;
include /etc/nginx/conf.d/common-ssl.conf; # 同样是一行引入
location / { ... }
}细节:listen 参数:
listen 处需要再后面添加 ssl:
- ❌ 错误写法:
listen 443; - ✅ 正确写法:
listen 443 ssl;
在 Nginx 中,如果你想让这个端口处理 HTTPS 请求,必须在端口号后面显式加上 ssl 关键字,否则 Nginx 会用处理 HTTP 的方式去处理加密流量,导致浏览器报错“发送了无效响应”。